#include"servenetcal.hpp"
#include"protocol.hpp"
#include"cal.hpp"
#include"Daemon.hpp"

//应用层其实就是我们对 请求和应答 进行封装或者拆解 拿到正文 因为发的网络中的是报头和正文 才构成了我的一个完整报文
//表示层是对我们请求的内容 规定一个格式
//报文是网络中数据传输的基本单位 包扩主体部分和我们的报头 之间我们要做好区分的工作
//协议如何封装和分用时至关重要的
using namespace SocketModule;
int main(int argc, char *argv[])
{

     ENABLE_FILE_LOG_STRATEGY();
    if (argc != 2)
    {
        std::cout << "Uage:" << argv[0] << "prot" << std::endl;
        return 0;
    }

    uint16_t port = std::stoi(argv[1]);
     LOG(LogLevel::DEBUG) << "服务器已经启动，已经是一个守护进程了" ;
    Daemon(0,0);
   
    //1.计算机
    std::unique_ptr<Cal> cal=std::make_unique<Cal>();
    
    //注册方法
    //2.协议
    std::unique_ptr<Protocol> pro=std::make_unique<Protocol>([&cal](Request req)->Response{
        return cal->Excute(req);
    });
    //3.服务层
    //注册方法
    std::unique_ptr<TcpServe> psvs = std::make_unique<TcpServe>(port, 
    [&pro](std::shared_ptr<Socket> sockfd, InetAddr peer) 
    {
      pro->GetRequest(sockfd,peer);  
    });
    //从tcp通信不断往上层回调
    psvs->Start();
    
    return 0;
}